home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-07-03 | 1.3 KB | 48 lines | [TEXT/R*ch] |
- (* Modified for Moscow ML from SML/NJ Library 0.2 file dynamic-array.sml
- *
- * COPYRIGHT (c) 1993 by AT&T Bell Laboratories.
- * See file mosml/copyrght/copyrght.att for details.
- *
- * Arrays of unbounded length
- *
- *)
-
- datatype 'elem array = BLOCK of 'elem Array.array ref * 'elem
-
- fun array (sz, dflt) = BLOCK(ref (Array.array (sz,dflt)),dflt)
-
- fun subArray (BLOCK(arr,dflt),lo,hi) = let
- val arrval = !arr
- fun copy i = (Array.sub(arrval,i+lo)) handle _ => dflt
- in
- BLOCK(ref(Array.tabulate(hi-lo,copy)),dflt)
- end
-
- fun fromList (initlist, dflt) = BLOCK(ref (Array.fromList initlist),dflt)
-
- fun tabulate (sz,fillfn,dflt) = BLOCK(ref (Array.tabulate (sz,fillfn)),dflt)
-
- fun default (BLOCK(_,dflt)) = dflt
-
- fun sub (BLOCK(arr,dflt),idx) = (Array.sub(!arr,idx))
- handle Subscript => if idx < 0 then raise Subscript else dflt
-
- fun bound (BLOCK(arr,_)) = Array.length (!arr)
-
- fun expand(arr,oldlen,newlen,dflt) = let
- fun fillfn i = if i < oldlen then Array.sub(arr,i) else dflt
- in
- Array.tabulate(newlen,fillfn)
- end
-
- fun update (b as BLOCK(arr,dflt),idx,v) = let
- fun max(x, y: int) = if x>y then x else y
- val len = bound b
- in
- if idx >= len
- then arr := expand(!arr,len,max(len+len,idx+1),dflt)
- else ();
- Array.update(!arr,idx,v)
- end
-
-